package JDBC.JDBC_API.PreparedStatementDemo;


import JDBC.utils.GetConnectionUtils;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class index {
    public static void main(String[] args) throws Exception {
        //PreparedStatement作用：
        //预编译SQL并执行，防止SQL注入
        //SQL注入：SQL注入是通过操作输入来修改事先定义好的SQL语句，用以达到执行代码对服务器进行攻击的方法
        //比如：在没有防止SQL的项目登录时，即使用了不正确的用户名，密码输入一段SQL脚本，也能登录成功，并且可以为所欲为，十分危险
        //PreparedStatement好处：
        //1、预编译SQL,性能更高
        //2. 将敏感字符进行转义，防止SQL注入

        //预编译功能需要在url后面加上useServerPrepStmts=true配置，才可以开启

        //注册驱动（不用写）

        //获取连接
        //Connection cnt = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc_study", "root", "lyx254254");
        Connection cnt = GetConnectionUtils.getConnection();

        //编写SQL语句
        //prepareStatement参数的SQL语句，要用?作为占位符代替参数的值
        String sql = """
                select *
                from user
                where name = ?
                  and password = ?;
                 """;

        //获取执行SQL的对象
        PreparedStatement preSta = cnt.prepareStatement(sql);

        //传递参数
        Scanner sc = new Scanner(System.in);
        System.out.print("输入用户名：");
        String username = sc.next();
        System.out.print("输入密码：");
        String password = sc.next();

        //设置?代替的参数
        //setXxx()方法参数：
        //1、问号的编号，从1开始（第几个问号）
        //2、参数值
        preSta.setString(1, username);
        preSta.setString(2, password);

        //执行SQL
        ResultSet results = preSta.executeQuery();

        //判断是否登录成功
        if (results.next()) {
            System.out.println("登录成功！");
        } else {
            System.out.println("登录失败！-");
        }


    }
}
